# -*- coding: utf-8 -*-
__author__ = 'sunnychou'
__date__ = '2019/7/4 21:27'

'''
安装库：
pip install xlwt
pip install xlsxwriter
'''

import xlwt, xlrd
import xlsxwriter

class XLSXBooker(object):
    def  __init__(self, xlsx_name, doc_code):
        '''
        操作excel封装类
        :param xlsx_name:
        :param doc_code: 文档编号
        '''
        self.__xlsx_name = xlsx_name
        self.__doc_code = doc_code
        self.__workbook = xlsxwriter.Workbook(self.__xlsx_name)
        self.__worksheet = None

    def __del__(self):
        self.__workbook.close()

    def add_worksheet(self, sheet_name='mysheet'):
        '''
        添加一个sheet标签页
        :param sheet_name:
        :return:
        '''
        self.__worksheet = self.__workbook.add_worksheet(sheet_name)
        #给文档sheet加上文档标识
        self.__worksheet.merge_range('A1:W1', self.__doc_code, self.__workbook.add_format({
        'font_size': 10,
        'bold': True,
        'border': 2,
        'align': 'right',  # 水平居右侧
        'valign': 'vcenter',  # 垂直居中
        }))

    def set_unit_column_width(self, column_range='A:A', column_width=6):
        '''
        设置单元格列属性（或者单元格范围）的宽度
        :param column_range: A:F
        :param column_width: 列宽度
        :return:
        '''
        self.__worksheet.set_column(column_range, column_width)

    def set_unit_row_height(self, row_index = 1, row_height = 20):
        '''
        设置单元格行索引的高度
        :param row_index: 行索引， eg: row_index=1 表示第二行
        :param row_height: 行高
        :return:
        '''
        self.__worksheet.set_row(row_index, row_height)


    def add_worksheet_merge_range(self, range_column='A1:B1', content='', font_size=20,
                                  bold=True, border=0, align='center', valign='vcenter',
                                  color='black', fg_color='white'):
        '''
        ###############################
        默认excel表格列属性格式如下：
        A1   B1    C1    D1   E1
        A2   B2    C2    D2   E2
        A3   B3    C3    D3   E3
        ################################
        :param range_column: 合并列属性范围   eg:  range_column='A1:B1' 表示合并A1和B1两列
        :param content:    合并后填充的内容
        :param font_size:  文本字体大小
        :param bold:       粗体
        :param border:     合并后单元格的边框大小，0表示无边框    1表示边框宽度大小为1
        :param align:      文本的水平位置  align取三个值：center--居中，left--居左，right--居右
        :param valign:     文本的垂直位置 valign取三个值：vcenter--垂直居中，vleft--垂直居左，vright--垂直居右
        :param color:      文本的字体颜色：默认为黑色
        :param fg_color：  单元格背景颜色：默认为白色
        :return:
        '''
        try:
            workbook_style = dict(
                font_size=font_size,
                bold=bold,
                border=border,
                align=align,
                valign=valign,
                color=color,
                fg_color=fg_color,
            )
            self.__worksheet.merge_range(range_column, content, self.__workbook.add_format(workbook_style))
            return True
        except Exception as e:
            print("add_worksheet_merge_range has error :{e}")
            return False

    def  add_worksheet_unit(self, column='D8', content='', font_size=20,
                                  bold=True, border=0, align='center', valign='vcenter',
                                  color='black', fg_color='white'):
        '''
        :param column:   列属性名称 column='D8' 第D列的第8行单元格
        :param content:  添加内容
      :param font_size:  文本字体大小
        :param bold:       粗体
        :param border:     合并后单元格的边框大小，0表示无边框    1表示边框宽度大小为1
        :param align:      文本的水平位置  align取三个值：center--居中，left--居左，right--居右
        :param valign:     文本的垂直位置 valign取三个值：vcenter--垂直居中，vleft--垂直居左，vright--垂直居右
        :param color:      文本的字体颜色：默认为黑色
        :param fg_color：  单元格背景颜色：默认为白色
        :return:
        '''
        workbook_style = dict(
            font_size=font_size,
            bold=bold,
            border=border,
            align=align,
            valign=valign,
            color=color,
            fg_color=fg_color,
        )
        try:
            self.__worksheet.write(column, content, self.__workbook.add_format(workbook_style))
            return True
        except:
            return False


class ExcelReader(object):
    def __init__(self, name, sheet_name="Sheet1"):
        '''
        :param name: excel文档名称
        :param sheet_name:  excel sheet名称
        '''
        self.__bk = xlrd.open_workbook(name)
        self.__sheet = self.__get_sheet(sheet_name)

    def __get_sheet(self, sheet_name):
        try:
            return self.__bk.sheet_by_name(sheet_name)
        except Exception as e:
            print(f"__get_sheet has error:{e}")
            return None


    def get_sheets(self):
        '''
        文档有多少个sheet
        :return:
        '''
        return self.__bk.nsheets

    def get_rows_cols(self):
        '''
        获取行和列
        :return:
        '''
        return (self.__sheet.nrows, self.__sheet.ncols)


    def get_the_pos_cell(self, row, col):
        '''
        获取第row行，第col列的元素
        :param row:
        :param col:
        :return:
        '''
        return self.__sheet.cell_value(row, col)

    def get_excel_headers(self):
        return self.get_row_values(0)


    def get_excel_data_list(self):
        data_result_list = []
        (rows, cols) = self.get_rows_cols()
        for row in range(rows):
            if row == 0:
                continue
            row_values = self.get_row_values(row)
            data_result_list.append(row_values)
        return data_result_list

    def get_row_values(self, row):
        '''
        获取第row行数据
        :param row:
        :return:
        '''
        return self.__sheet.row_values(row)
